package com.duoduo.深度广度优先;

import com.duoduo.TreeNode;

import java.util.ArrayList;
import java.util.List;

/**
 * @author dl.chai
 * @version 1.0
 * @description: 路径总和2
 * 给你二叉树的根节点 root 和一个整数目标和 targetSum ，找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
 *
 * 叶子节点 是指没有子节点的节点。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
 * 输出：[[5,4,11,2],[5,8,4,5]]
 * 示例 2：
 *
 *
 * 输入：root = [1,2,3], targetSum = 5
 * 输出：[]
 * @date 2023/3/28 21:42
 */

public class 路径总和2 {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> result=new ArrayList<>();

        if (root==null){
            return result;
        }
        List<Integer> path=new ArrayList<>();
        dfs(result,path,root,targetSum);
        return result;
    }

    private void dfs(List<List<Integer>> result, List<Integer> path, TreeNode root, int targetSum) {
        path.add(root.val);
        if (root.left==null && root.right==null){
            if (targetSum==root.val){
               result.add(new ArrayList<>(path));
            }
            return;
        }
        if (root.left!=null){
            dfs(result,path,root.left,targetSum-root.val);
            //回溯
            path.remove(path.size()-1);
        }
        if (root.right!=null){
            dfs(result,path,root.right,targetSum-root.val);
            path.remove(path.size()-1);        }
    }
}
